package com.he.DesignPatterns.Singleton;

/**
 * @description: 懒汉式方法2：线程安全
 * @Author: HCL
 * @Date: 2024/8/23 15:41
 */
public class SingleFour {

    //1 私有构造
    private SingleFour(){
        if (instance == null){
            throw new RuntimeException("不能创建多个对象");
        }
    }

    //2 声明变量
    //在多线程的情况下，可能会出现空指针问题，出现问题的原因是JM在实例化对象的时候会进行优化和指令重排序操作
    //要解决双重检查锁模式带来空指针异常的问题，只需要使用 volatile 关键字， vo1atile 关键字可以保证可见性和有序性。
    private static volatile SingleFour instance;

    //3对外提供访问方法
    public static SingleFour getInstance(){
        //第一次不为null时直接返回，为null时才加锁，可以减低synchronized的空间消耗
        if (instance == null){
            synchronized (SingleFour.class){
                if (instance == null){
                    instance = new SingleFour();
                }
            }
        }
        return instance;
    }
}
